<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>03_函数的call与bind方法</title>
</head>
<body>
<script>
  // bind方法是定义在哪的? 所有函数都能调用它 ==> Function的原型对象
  // 返回一个新函数,新函数内部会调用原函数, 且this为bind的第一个参数对象
  Function.prototype.bind = function (thisObj) {
    console.log('bind')
    // const that = this  // this是原函数
    return () => {
      // 得到调用bind的函数
      // that.call(thisObj)
      this.call(thisObj)
    }
  }

</script>
<script>
  /* 
  函数的call与bind方法
  1. 作用
    改变/指定函数中this 为call/bind方法的第一个参数对象
  2. 区别
    call: 立即调用, 并指定/绑定this为第一个参数对象
    bind: 不立即调用, 只先做this的绑定, 
        返回一个新函数,新函数内部会调用原函数, 且this为bind的第一个参数对象
        当调用新函数时, 原函数就会执行, 且this为bind的第一个参数对象
  3. 如何选择
    如果需要立即执行: call
    如果后面才执行: bind
  */

  const obj = {m: 1}
  function fn() {
    console.log(this)
  }
  // fn() // window
  // 让fn中的this为obj

  // 使用call
  // fn.call(obj)   // apply与call的特点一样
  // 使用bind
  const fn2 = fn.bind(obj)
  // fn() // 不可以, this还是window
  fn2()
</script>

</body>
</html>